package com.dmall.promotion.pool;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * 线程池拒绝策略：
 * 1.CallerRunsPolicy：当触发拒绝策略时，只要线程池没有关闭，就由提交任务的当前线程处理。
 * 2.AbortPolicy（默认）：当触发拒绝策略时，直接抛出拒绝执行的异常，中止策略的意思也就是打断当前执行流程。
 * 3.DiscardPolicy：直接静悄悄的丢弃这个任务，不触发任何动作。
 * 4.DiscardOldestPolicy：如果线程池未关闭，就弹出队列头部的元素，然后尝试执行。
 * 使用AbortPolicy拒绝策略的时候，需要注意异常的处理，因为当这种拒绝策略触发的时候会抛出异常：RejectedExecutionException
 *
 * 线程池的核心线程和最大线程不建议设置得很大，具体要看机器的核心数，一般最大线程数不要超过机器的核心数
 * 如果设置过大，反而性能不会太好，因为线程之间的调度也是会有性能开销的
 *
 * @author xiao1.wang
 * @date 2021-06-03 13:21:52
 */
@Configuration
public class ThreadPoolConfiguration {

    @Bean(name = "taskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        poolTaskExecutor.setCorePoolSize(4);
        poolTaskExecutor.setMaxPoolSize(10);
        poolTaskExecutor.setQueueCapacity(10000);
        poolTaskExecutor.setKeepAliveSeconds(1000);
        poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        poolTaskExecutor.setThreadNamePrefix("common-thread-pool-");
        return poolTaskExecutor;
    }
}
